package work.xiaohong.arithmetic.IO;

import javax.xml.crypto.Data;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Date;

/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/10/27 0027 17:28
 * @description 文件操作
 */
public class FileTest {

    public static void main(String[] args) throws Exception {
//        fileHandle();
//        directoryHandle();
//        listDir(new File("c:\\a"));
        deletDir(new File("c:\\a"));
    }


    /**
     * 文件操作
     * @throws Exception
     */
    public static void fileHandle() throws Exception{

        System.out.println("路径分隔符："+File.pathSeparator);
        System.out.println("名称分隔符"+File.separator);

//        File file = new File("file.txt");
        File file = new File("c:\\file.txt");
        // 创建文件
        if (!file.exists()){
            System.out.println(file.createNewFile());
        }

        // 获取文件信息
        System.out.println("文件的绝对路径"+file.getAbsolutePath());
        System.out.println("你写的路径"+file.getPath());
        System.out.println("文件名称"+file.getName());
        System.out.println("文件的父路径"+file.getParent());
        System.out.println("文件的大小"+file.length());
        System.out.println("文件的创建时间"+new Date(file.lastModified()));

        System.out.println("文件是否可写"+file.canWrite());
        System.out.println("文件是否隐藏"+file.isHidden());
        System.out.println("是否是文件"+file.isFile());


        // 立马删除文件
//        boolean delete = file.delete();

        // 在JVM退出时删除文件
        file.deleteOnExit();
        Thread.sleep(2000);

    }


    /**
     * 文件夹操作
     * @throws Exception
     */
    public static void directoryHandle() throws Exception{
        File dir = new File("c:\\a\\b\\c");

        // 创建文件夹
        if (!dir.exists()){
            // 创建单级目录
//            System.out.println(dir.mkdir());
            // 创建多级目录
            System.out.println(dir.mkdirs());
        }

        // 获取文件夹信息
        System.out.println("文件夹的绝对路径"+dir.getAbsolutePath());
        System.out.println("你写的路径"+dir.getPath());
        System.out.println("文件夹名称"+dir.getName());
        System.out.println("文件夹的父路径"+dir.getParent());
        System.out.println("文件夹的大小"+dir.length());
        System.out.println("文件夹的创建时间"+new Date(dir.lastModified()));

        System.out.println("文件夹是否隐藏"+dir.isHidden());
        System.out.println("是否是文件夹"+dir.isDirectory());

        // 遍历文件夹
//        for (String s : dir.list()) {
//            System.out.println(s);
//        }

        for (File s : dir.listFiles()) {
            System.out.println(s.getName());
        }

        // 遍历文件夹并设置过滤条件
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().endsWith(".txt"))
                    return true;
                return false;
            }
        });

        for (File file : files) {
            System.out.println(file.getName());
        }


        // 直接删除文件夹 只删除最底层的目录c,而且必须是空目录
//        System.out.println(dir.delete());

        // 虚拟机退出时删除文件夹 只删除最底层的目录c,而且必须是空目录
        dir.deleteOnExit();
        Thread.sleep(2000);

    }


    /**
     * 递归遍历文件夹
     * @param file
     */
    public static void listDir(File file){
        File[] files = file.listFiles();
        if (files != null && files.length > 0){
            for (File f : files) {
                if (f.isDirectory()){
                    listDir(f);
                }else {
                    System.out.println(f.getName());
                }
            }
        }
    }


    /**
     * 递归删除文件夹
     * @param file
     */
    public static void deletDir(File file){
        File[] files = file.listFiles();
        if (files != null && files.length > 0){
            for (File f : files) {
                if (f.isDirectory()){
                    deletDir(f);
                }else {
                    // 删除文件
                    f.delete();
                }
            }
        }
        // 删除文件夹
        file.delete();

    }


}
